"""
标注工具

版本 1.0 实现了基本的标注功能 2020-7-29 03:56:02

by f.s.xs
"""

import os
import re

"""name = [
    "fsx",
    "ly",
    "lk",
    "lws",
    "gsy"
]"""
QQ = []
name = []


def login_init():
    global QQ
    global name
    QQ.append("2877267169@qq.com")
    name.append("冯世新")

    QQ.append("1964432989@qq.com")
    name.append("刘  毅")

    QQ.append("1905253273@qq.com")
    name.append("郭思雅")

    QQ.append("1662450617@qq.com")
    name.append("刘  康")

    QQ.append("2432795761@qq.com")
    name.append("刘文淑")

    QQ.append("3310275889@qq.com")
    name.append("测试员一号")


# abs_wb_file_name:指标记输出的文件夹的绝对路径
def write_a_wb_mark(abs_wb_file_name: str, mark: str):
    with open(abs_wb_file_name, 'w+', encoding='utf-8') as f:
        f.write(mark)


def get_mark(abs_file_base_dir: str, file_name: str):
    if os.path.isfile(
            os.path.join(
                abs_file_base_dir,
                file_name
            )
    ) is False:
        return ("未标记", "没有找到标记")
    else:
        with open(
                os.path.join(
                    abs_file_base_dir,
                    file_name
                ),
                'r+',
                encoding='utf-8'
        ) as f:
            r = f.readline()
        return ("已标记", r)

# # 获得用户的输入
def req():
    while True:
        a = input(
            """
            
            *** 选项 ***
              0 不是谣言
              1 消息未经证实
              2 消息与事实不符
              3 没有事实根据的消息
            *-0 如果未要求传播，就在后面加一个"-0"
            *-1 如果要求传播，就在后面加一个"-1"
            *-*-0 积极或不重要
            *-*-1 消极或重要
              
            *** 提示: 输入前面的标号，按回车确认
                  程序将自动写入，并自动跳转至下一个回复或微博 ***
                  
            ### 高级操作 ###
              p=previous, j=jump to...(index only)
              ~=不做操作，跳过
            
            """
        )
        if a == 'p' or a == 'j' or a == '~':
            return a

        res = re.findall(r"^[0-3]-[0-1]-[0-1]$", a)

        if len(res) == 0:
            print("不合规的输入，请重试.")
            continue
        else:
            return res[0]


# 输出一段长消息，默认每9个字符换一下行
# 据说一行9个字恰好能让人一目十行.
# 新闻提词机就是一行9个字.
def print_long_message(s: str, char_num=9, before_line="", first_line=0):
    cnt = 1  # cnt的意思是本行字符计数
    all_cnt = 0
    # ##############为第一行字数开的特例############### #
    if first_line != 0:
        print(before_line, end='')  # 在每行行首的提示文字
        while all_cnt < min(first_line, len(s)):
            print(s[all_cnt], end='')
            if s[all_cnt] == '\n':
                all_cnt += 1
                break
            all_cnt += 1
    # ##############为第一行字数开的特例############### #

    while all_cnt < len(s):
        if cnt == 1:  # 在每行行首的提示文字
            print(before_line, end='')

        print(s[all_cnt], end='')
        all_cnt += 1
        if s[all_cnt - 1] == '\n':  # 遇到行尾就重置
            cnt = 1
            continue

        if cnt == char_num:
            cnt = 1
            print('\n', end='')
            continue
        cnt += 1


# 获得某一个文件的内容
def get_file_message(abs_file_path: str):
    r = ""
    # print('os.path.isfile(%s) = %d' % (abs_file_path, os.path.isfile(abs_file_path)))
    if os.path.isfile(abs_file_path) is True:
        print("文件验证成功:%s"%abs_file_path.split('\\')[-1])
        with open(abs_file_path, 'r+', encoding='utf-8') as f:
            s = f.readlines()

        # 将读取内容合并
        for t in s:
            r += t
            r += '\n'
        return r
    else:
        print("这个文件不存在，请检查路径完整性！\n%s" % abs_file_path)
        return "文件错误，未读取成功!"


# 对某一个微博展开
# state_str：在输入提示前的状态文字
def work_a_wb(abs_filename: str, mark_work_path: str, state_str: str = "", before_line="微博原文 >>   "):
    print("=" * 10)
    print_long_message(
        get_file_message(
            abs_file_path=abs_filename
        ).replace('\t', '\n'),
        before_line=before_line,  # 在行首提示的那一段话
        first_line=11
    )
    print("=" * 10)

    print(state_str)  # 输出状态文字
    my_in = req()
    if my_in == 'p':
        return [1, -1]  # pass  # 跳转到前一个！
    elif my_in == '~':
        return [1, -2]  # pass  # 跳转到下一个！

    elif my_in == 'j':
        a = input("(number only!)index: ")
        return [1, int(a)]  # pass  # 跳转到指定微博！
    elif my_in == '文件错误，未读取成功!':
        return [2, ""]  # 文件错误！
    else:  # 正确！！！
        write_a_wb_mark(
            abs_wb_file_name=os.path.join(
                mark_work_path,
                abs_filename.split('\\')[-1]
            ),
            mark=my_in
        )
        return [0, ""]  # 正确的标记！


# 开始工作
def work(work_path: str):
    with open(os.path.join(work_path, "index.txt"), 'r+', encoding='utf-8') as f:
        names = f.readlines()

    weibocnt = 0
    repcnt = 0

    while weibocnt < len(names):
        os.system('cls')
        now_state_word = (

                (("状态：微博索引：%d/%d   " % (weibocnt, len(names))) * 3) + '\n' +
                ("标记状态:<%s>: \"%s\"" % get_mark(
                    os.path.join(work_path, 'mark'), names[weibocnt][:-1]
                )
                 )
        )
        print(now_state_word)
        state = work_a_wb(
            abs_filename=os.path.join(work_path, names[weibocnt][:-1]),  # 将要处理的微博文本文件的*绝对路径*传入,
            # -1是为了要去掉结尾的换行
            mark_work_path=os.path.join(work_path, 'mark'),  # 这是标注文件夹的工作路径
            state_str=now_state_word  # 在输入提示前的状态文字
        )
        if state[0] == 1:
            if state[1] == -1:  # 上一个
                weibocnt -= 1
                if weibocnt < 0:  # 不能让标号小于0！
                    weibocnt = 0
                continue
            if state[1] == -2:  # 下一个
                state[0] = 0
                #weibocnt += 1
                #continue
            else:  # 指定的位置 注意！这个位置如果大于总数将直接跳出！
                weibocnt = int(state[1])
                if weibocnt < 0:  # 不能让标号小于0！
                    weibocnt = 0
                continue
        # //划去//其余的，有错没错都不理他//划去//

        if state[0] == 0:
            # 正确的标记！
            # ###################现在是处理他的回复################### #

            with open(  # 获取回复文件列表
                    os.path.join(
                        work_path,
                        'reply',
                        names[weibocnt][:-1].replace('.txt', ''),
                        'reply_index.txt'
                    ),
                    'r+',
                    encoding='utf-8'
            ) as f:
                reply_names = f.readlines()
            # 重置
            if repcnt >= 0:
                print("检测到未重置，现在重置weibocnt:%d->0"%repcnt)
                repcnt -= repcnt

            # 重置
            while repcnt < len(reply_names):
                os.system('cls')
                now_reply_state_word = (
                        (("状态：回复索引：%d/%d (在微博 %d/%d 之中)" % (
                            repcnt, len(reply_names), weibocnt, len(names))) * 2) + '\n' +
                        (
                                "标记状态:<%s>: \"%s\"" % get_mark(
                            abs_file_base_dir=os.path.join(
                                work_path,
                                'mark',
                                'reply',
                                names[weibocnt][:-1].replace('.txt', '')
                            ),
                            file_name=reply_names[repcnt][:-1]
                        )
                        )
                )

                print(now_reply_state_word)

                # ##############建立回复的输出文件夹 ##############
                if os.path.exists(os.path.join(
                        work_path,
                        'mark',
                        'reply',
                        names[weibocnt][:-1].replace('.txt', '')
                )
                ) is False:
                    os.mkdir(
                        os.path.join(
                            work_path,
                            'mark',
                            'reply',
                            names[weibocnt][:-1].replace('.txt', '')
                        )
                    )
                # ##############建立回复的输出文件夹 ##############

                # ##############提示原微博 ##############
                print("=" * 10)
                print_long_message(
                    get_file_message(
                        abs_file_path=os.path.join(
                            work_path,
                            names[weibocnt][:-1]
                        )
                    ).replace('\t', '\n'),
                    before_line="原微博 >>  ",  # 在行首提示的那一段话
                    first_line=11
                )
                # ##############提示原微博 ##############

                reply_state = work_a_wb(
                    abs_filename=os.path.join(
                        work_path,
                        'reply',
                        names[weibocnt][:-1].replace('.txt', ''),
                        reply_names[repcnt][:-1]
                    ),
                    mark_work_path=os.path.join(
                        work_path,
                        'mark',
                        'reply',
                        names[weibocnt][:-1].replace('.txt', '')
                    ),
                    state_str=now_reply_state_word,
                    before_line="回复 >>  "
                )
                ############对状态码的处理#############
                if reply_state[0] == 1:
                    if reply_state[1] == -1:  # 上一个
                        repcnt -= 1
                        if repcnt < 0:  # 不能让标号小于0！
                            repcnt = 0
                        continue
                    elif reply_state[1] == -2:  # 下一个
                        repcnt += 1
                        continue
                    else:  # 指定的位置 注意！这个位置如果大于总数将直接跳出！
                        repcnt = int(reply_state[1])
                        if repcnt < 0:  # 不能让标号小于0！
                            repcnt = 0
                        if repcnt >= len(reply_names):  # 如果大于，就跳出
                            repcnt = 0  # 由于在回复循环之外、
                            # 微博循环之内没有重置语句了
                            # 因此需要手动重置
                            break
                        continue
                ############对状态码的处理#############
                repcnt += 1

            # ###################现在是处理他的回复################### #

        weibocnt += 1


def go():
    global QQ
    global name
    os.system("cls")

    # #########登录检测########### #
    login_init()
    is_correct = False  # 是否登陆成功，打破循环用
    while is_correct is False:
        my_qq = input("输入口令：\n > ").replace('\n', '')
        for i in range(len(QQ)):
            # print("%s-%s"%(QQ[i], my_qq))
            if QQ[i] == my_qq:
                is_correct = True
                os.system('title %s' % name[i])
                print("欢迎, %s\n" % name[i])
                break
        if is_correct is False:
            print("错误的口令，请重试\n")
    # #########登录检测########### #

    while True:
        work_path = input("选择工作目录：").replace('"', '')
        if (
                (os.path.exists(work_path) is True) and
                (os.path.isfile(work_path) is False) and
                (os.path.isfile(os.path.join(work_path, "index.txt")) is True)
        ):
            print("路径正确. 是否现在开始？[y/n]")
            a = input()
            if a == 'y' or a == 'Y':

                # 标注文件夹的建立，如果没有，就建立
                if os.path.exists(os.path.join(work_path, 'mark')) is False:
                    os.mkdir(os.path.join(work_path, 'mark'))
                if os.path.exists(os.path.join(work_path, 'mark\\reply')) is False:
                    os.mkdir(os.path.join(work_path, 'mark\\reply'))

                # 开始工作
                work(work_path=work_path)
            else:
                os.system('cls')
                print("你取消了任务.")
            break
        else:
            print("错误的路径.")
            continue


def chk_and_print_finish():
    while True:
        work_path = input("选择工作目录：").replace('"', '')
        if (
                (os.path.exists(work_path) is True) and
                (os.path.isfile(work_path) is False) and
                (os.path.isfile(os.path.join(work_path, "index.txt")) is True)
        ):
            print("路径正确. 是否现在开始？[y/n]")
            a = input()
            if a == 'y' or a == 'Y':

                # 标注文件夹的建立，如果没有，就建立
                if os.path.exists(os.path.join(work_path, 'mark')) is False:
                    os.mkdir(os.path.join(work_path, 'mark'))
                ############现在开始检测##############
                with open(
                        os.path.join(work_path, 'index.txt'),
                        'r+',
                        encoding='utf-8'
                ) as f:
                    filelist = f.readlines()
                cnt = 0
                for s in filelist:
                    a_file = s[:-1]
                    print(
                        "索引%03d: %s 状态: %s" % (
                            cnt,
                            a_file,
                            get_mark(
                                abs_file_base_dir=os.path.join(
                                    work_path,
                                    'mark'
                                ),
                                file_name=a_file
                            )[1]
                        )
                    )
                    cnt+=1
        else:
            print("错误的路径.")
                ############检测结束##############


def main():

    os.system('chcp 65001')  # 转换控制台为 utf-8 编码
    while True:
        os.system('cls')
        print("""
        
        标注工具 v1.0
        选择功能：
            1. 开始标注
            2. 检测
            3. 退出
            """
              )

        a = input()
        if a == '1':
            go()







        elif a == '2':
            """print('注意：此功能只能检查微博文本，无法检查到回复！')
            chk_and_print_finish()
            print('注意：此功能只能检查微博文本，无法检查到回复！')"""
            print('注意，此功能已经转移至 note_chick_run.py')
            continue
        else:
            return


main()
